const { getData, getLocalDataFile, saveData } = require("./utils");
const axios = require("axios");
const marked = require("marked");
const rendererMD = new marked.Renderer();
const path = require("path");
const os = require("os");

const appPath = path.join(getLocalDataFile());
const dbPath = path.join(appPath, "./db.json");

let filePath = "";
function getQueryVariable(variable) {
  var query = window.location.search.substring(1);
  var vars = query.split("&");
  for (var i = 0; i < vars.length; i++) {
    var pair = vars[i].split("=");
    if (pair[0] == variable) {
      return pair[1];
    }
  }
  return false;
}

if (location.href.indexOf("targetFile") > -1) {
  filePath = decodeURIComponent(getQueryVariable("targetFile"));
} else {
  filePath =
    process.platform === "win32"
      ? location.pathname.replace("/", "")
      : location.pathname.replace("file://", "");
}
const {
  ipcRenderer,
  nativeImage,
  clipboard,
  remote,
  shell,
} = require("electron");

const currentWindow = remote.getCurrentWindow();
const winId = currentWindow.id;
const BrowserWindow = remote.BrowserWindow;

function convertImgToBase64(url, callback, outputFormat) {
  var canvas = document.createElement("CANVAS"),
    ctx = canvas.getContext("2d"),
    img = new Image();
  img.crossOrigin = "Anonymous";
  img.onload = function() {
    canvas.height = img.height;
    canvas.width = img.width;
    ctx.drawImage(img, 0, 0);
    var dataURL = canvas.toDataURL(outputFormat || "image/png");
    callback.call(this, dataURL);
    canvas = null;
  };
  img.src = url;
}

window.rubick = {
  // 事件
  onPluginEnter(cb) {
    ipcRenderer.on("onPluginEnter", (e, message) => {
      const feature = message.detail;
      cb({
        ...feature,
        type: message.cmd.type ? message.cmd.type : "text",
        payload: message.payload,
      });
    });
  },
  onPluginReady(cb) {
    ipcRenderer.once("onPluginReady", (e, message) => {
      const feature = message.detail;
      cb({
        ...feature,
        type: message.cmd.type ? message.cmd.type : "text",
        payload: message.payload,
      });
    });
  },
  onPluginOut(cb) {
    ipcRenderer.once("onPluginOut", (e, message) => {
      const feature = JSON.parse(message.detail);
      cb({ ...feature, type: "text" });
    });
  },

  // 窗口交互
  hideMainWindow() {
    ipcRenderer.send("msg-trigger", {
      type: "hideMainWindow",
    });
  },
  showMainWindow() {
    ipcRenderer.send("msg-trigger", {
      type: "showMainWindow",
    });
  },
  setExpendHeight(height) {
    ipcRenderer.send("msg-trigger", {
      type: "setExpendHeight",
      height,
      winId,
    });
  },
  setSubInput(onChange, placeHolder, isFocus) {
    ipcRenderer.sendToHost("setSubInput", {
      placeHolder,
      isFocus,
    });
    ipcRenderer.on(`msg-back-setSubInput`, (e, result) => {
      onChange({ text: result });
    });
  },

  removeSubInput() {
    ipcRenderer.sendToHost("removeSubInput");
  },

  setSubInputValue(text) {
    ipcRenderer.sendToHost("setSubInputValue", {
      text,
    });
  },

  getPath(name) {
    return remote.app.getPath(name);
  },

  showNotification(body, clickFeatureCode) {
    const myNotification = new Notification("Rubick 通知", {
      body,
    });
    return myNotification;
    // todo 实现 clickFeatureCode
  },
  showOpenDialog(options) {
    ipcRenderer.send("msg-trigger", {
      type: "showOpenDialog",
      options: { ...options },
    });
    return new Promise((resolve, reject) => {
      ipcRenderer.once(`msg-back-showOpenDialog`, (e, result) => {
        result ? resolve(result) : reject();
      });
    });
  },

  copyImage(img) {
    convertImgToBase64(img, function(base64Image) {
      const image = nativeImage.createFromDataURL(base64Image);
      clipboard.writeImage(image);
    });
  },
  copyText(text) {
    clipboard.writeText(text);
  },
  db: {
    put(data) {
      data._rev = "";
      let dbData = getData(dbPath) || [];
      let target = [];
      dbData.some((d, i) => {
        if (d._id === data._id) {
          target = [d, i];
          return true;
        }
        return false;
      });

      // 更新
      if (target[0]) {
        dbData[target[1]] = data;
      } else {
        dbData.push(data);
      }
      saveData(dbPath, dbData);
      return {
        id: data._id,
        ok: true,
        rev: "",
      };
    },
    get(key) {
      const dbData = getData(dbPath) || [];
      return dbData.find((d) => d._id === key) || "";
    },
    remove(key) {
      key = typeof key === "object" ? key._id : key;
      let dbData = getData(dbPath);
      let find = false;
      dbData.some((d, i) => {
        if (d._id === key) {
          dbData.splice(i, 1);
          find = true;
          return true;
        }
        return false;
      });
      if (find) {
        saveData(dbPath, dbData);
        return {
          id: key,
          ok: true,
          rev: "",
        };
      } else {
        return {
          id: key,
          ok: false,
          rev: "",
        };
      }
    },
    bulkDocs(docs) {
      const dbData = getData(dbPath);
      dbData.forEach((d, i) => {
        const result = docs.find((data) => data._id === d._id);
        if (result) {
          dbData[i] = result;
        }
      });
      saveData(dbPath, dbData);
      return docs.map((d) => ({
        id: d._id,
        success: true,
        rev: "",
      }));
    },
    allDocs(key) {
      const dbData = getData(dbPath);
      if (!key) {
        return dbData;
      }
      if (typeof key === "string") {
        return dbData.filter((d) => d._id.indexOf(key) >= 0);
      }
      if (Array.isArray(key)) {
        return dbData.filter((d) => key.indexOf(d._id) >= 0);
      }
      return [];
    },
  },
  isDarkColors() {
    return false;
  },
  features: [],
  getFeatures() {
    ipcRenderer.sendToHost("getFeatures");
    return new Promise((resolve) => {
      ipcRenderer.on(`msg-back-getFeatures`, (e, result) => {
        rubick.features = result;
        resolve(result);
      });
    });
  },
  setFeature(feature) {
    ipcRenderer.sendToHost("setFeature", { feature });
  },

  removeFeature(code) {
    ipcRenderer.sendToHost("removeFeature", { code });
    return !!rubick.features.filter((fe) => fe.code === code).length;
  },
  // 系统
  shellOpenExternal(url) {
    shell.openExternal(url);
  },

  isMacOs() {
    return os.type() === "Darwin";
  },

  isWindows() {
    return os.type() === "Windows_NT";
  },

  isLinux() {
    return os.type() === "Linux";
  },

  shellOpenPath(path) {
    shell.openPath(path);
  },

  request(config = {}) {
    return axios.create({
      timeout: 10000,
      withCredentials: true,
      ...config,
    });
  },
};
const preloadPath = getQueryVariable("preloadPath") || "./preload.js";

require(path.join(filePath, "../", preloadPath));
window.exports &&
  ipcRenderer.sendToHost("templateConfig", {
    config: JSON.parse(JSON.stringify(window.exports)),
  });
window.ipcRenderer = ipcRenderer;
